package com.example.carbonbackend.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.carbonbackend.common.BaseResponse;
import com.example.carbonbackend.common.ErrorCode;
import com.example.carbonbackend.common.ResultUtils;
import com.example.carbonbackend.exception.ThrowUtils;
import com.example.carbonbackend.model.dto.company.CompanyQueryRequest;
import com.example.carbonbackend.model.dto.company.CompanyUpdateRequest;
import com.example.carbonbackend.model.entity.Company;
import com.example.carbonbackend.model.entity.CompanyUser;
import com.example.carbonbackend.model.entity.User;
import com.example.carbonbackend.model.vo.CompanyVO;
import com.example.carbonbackend.service.CompanyService;
import com.example.carbonbackend.service.CompanyUserService;
import com.example.carbonbackend.service.OssUploadService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.http.HttpRequest;

import static com.example.carbonbackend.constant.UserConstant.USER_LOGIN_STATE;

@RestController
@RequestMapping("/company")
@Slf4j
public class CompanyController {
    @Autowired
    private CompanyService companyService;

    @Autowired
    private OssUploadService ossUploadService;

    @Autowired
    private CompanyUserService companyUserService;



    /**
     * 分页查询公司信息列表，返回原始数据对象 Company。
     *
     * @param companyQueryRequest 包含查询条件的请求对象
     * @param httpServletRequest HTTP 请求对象
     * @return 分页查询结果，包含原始数据对象 Company
     */
    @PostMapping("/list/page")
    public BaseResponse<Page<Company>> listCompanyPage(@RequestBody CompanyQueryRequest companyQueryRequest, HttpServletRequest httpServletRequest) {
        // 创建 QueryWrapper 对象
        QueryWrapper<Company> queryWrapper = new QueryWrapper<>();

        int current = companyQueryRequest.getCurrent();
        int pageSize = companyQueryRequest.getPageSize();

        // 构建查询条件
        queryWrapper = companyService.getCompanyPage(companyQueryRequest);
        // 调用 companyService 的分页查询方法
        Page<Company> companyPage = companyService.page(new Page<>(current, pageSize), queryWrapper);

        log.info("{}",companyPage);
        return ResultUtils.success(companyPage);
    }

    /**
     * 分页查询公司信息列表，返回视图对象 CompanyVO。
     *
     * @param companyQueryRequest 包含查询条件的请求对象
     * @param httpServletRequest HTTP 请求对象
     * @return 分页查询结果，包含视图对象 CompanyVO
     */
    @PostMapping("/list/page/vo")
    public BaseResponse<Page<CompanyVO>> listCompanyPageVO(@RequestBody CompanyQueryRequest companyQueryRequest, HttpServletRequest httpServletRequest) {
        // 创建 QueryWrapper 对象
        QueryWrapper<Company> queryWrapper = new QueryWrapper<>();

        int current = companyQueryRequest.getCurrent();
        int pageSize = companyQueryRequest.getPageSize();

        // 构建查询条件
        queryWrapper = companyService.getCompanyPage(companyQueryRequest);
        // 调用 companyService 的分页查询方法
        Page<Company> companyPage = companyService.page(new Page<>(current, pageSize), queryWrapper);
        // 将原始数据对象转换为视图对象
        return ResultUtils.success(companyService.convertToPageVO(companyPage, httpServletRequest));
    }
//    @DeleteMapping("/delete")
//    public BaseResponse<CompanyVO> deteleCompany(String name){
//
//    }
    /**
     * 添加公司信息接口
     *
     * @param name 公司名称
     * @param address 公司地址
     * @param phone 公司电话
     * @param email 公司邮箱
     * @param type 公司类型
     * @param file 公司文件
     * @return 返回添加结果的基本响应对象，包含新增公司的ID
     */


    @PostMapping("/add")
    public BaseResponse<String> add(@RequestParam String name,
                                    @RequestParam String address,
                                    @RequestParam String phone,
                                    @RequestParam String email,
                                    @RequestParam String type,
                                    @RequestParam MultipartFile file,
                                    HttpServletRequest servletRequest) {
        // 创建新的公司对象
        Company company=new Company();
        // 设置公司属性
        company.setCompanyName(name);
        company.setAddress(address);
        company.setEmail(email);
        company.setPhoneNumber(phone);
        company.setType(type);
        //获取用户信息
        HttpSession session =servletRequest.getSession();
        User user= (User) session.getAttribute(USER_LOGIN_STATE);
        Long userId=user.getId();



        //companyUserService.getById(userId);
        // 上传文件并获取文件URL
        String url;
        try {
            url= (String) ossUploadService.uploadFile(file).getData();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 设置公司文件URL
        company.setCompanyFile(url);
        // 保存公司信息到数据库
        boolean saveResult= companyService.save(company);

        CompanyUser companyUser=new CompanyUser();
        companyUser.setCompanyId(company.getId());
        companyUser.setUserId(userId);
        companyUserService.save(companyUser);
        // 如果保存失败，抛出异常
        ThrowUtils.throwIf(!saveResult, ErrorCode.OPERATION_ERROR);
        // 返回成功响应，包含新增公司的ID
        return ResultUtils.success(company.getId().toString());
    }

    /**
     * 更新公司信息接口
     *
     * @param companyUpdateRequest 更新公司信息的请求对象
     * @return 返回更新结果的基本响应对象，包含更新后的公司ID
     */
    @PutMapping("/update")
    public BaseResponse<String> update(@RequestBody CompanyUpdateRequest companyUpdateRequest,HttpServletRequest servletRequest){
        // 创建新的公司对象
        Company company=new Company();
        // 将请求对象属性拷贝到公司对象中
        BeanUtils.copyProperties(companyUpdateRequest,company);
        // 构建查询条件
        LambdaQueryWrapper<Company> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Company::getCompanyName,companyUpdateRequest.getCompanyName());
        // 查询公司信息并获取其ID
        Long id=companyService.getOne(lambdaQueryWrapper).getId();
        // 设置公司ID
        company.setId(id);
        // 更新公司信息到数据库
        Boolean update= companyService.updateById(company);
        // 如果更新失败，抛出异常
        ThrowUtils.throwIf(!update,ErrorCode.OPERATION_ERROR);

        // 返回成功响应，包含更新后的公司ID
        return ResultUtils.success(company.getId().toString());
    }



}
